package Link;

public class LinkListClass <E>{
    public LinkNode<E> head;
    public LinkListClass(){
        head = new LinkNode<E>();
        head.next = null;
    }
    //头插法
    public void CreateListF(E[] a){
        LinkNode<E>s;
        for(int i = 0;i<=a.length;i++){
            s = new LinkNode<E>(a[i]);
            s.next = head.next;
            head.next=s;
        }
    }
    //尾插法
    public void CreateLIstRia(E[] a){
        LinkNode<E>s,t;
        t=head;
        for(int i = 0;i<a.length;i++){
            s=new LinkNode<E>(a[i]);
            t.next=s;
            t=s;
        }
        t.next = null;
    }
    //返回i的节点
    private LinkNode<E> geti(int i){
        LinkNode<E>p =head;
        int j = -1;
        while (j<i){
            j++;
            p = p.next;
        }
        return  p;
    }
    //将元素e添加到线性表的末尾
    public void Add(E e){
        LinkNode<E> s = new LinkNode<E>(e);
        LinkNode<E>p = head;
        while (p.next!=null){
            p = p.next;
        }
        p.next = s;
    }
    //求线性表的长
    public int size(){
        LinkNode<E> p =head;
        int cnt = 0;
        while (p.next!=null){
            cnt++;
            p=p.next;
        }
        return cnt;
    }
    //设置线性表的长
    public void Setsize(int nlen)  {
        int len = size();
        if(nlen<0 || nlen>len)
            throw new IllegalArgumentException("设置长度:n不在范围内");
        if (nlen ==len) {
            return;
        }
        LinkNode<E>p = geti(nlen-1);
        p.next=null;
    }
    //求序号为i的元素
    public E GetElem(int i ){
        int len = size();
        if(i<0 || i>len-1){
            throw new IllegalArgumentException("查找：位置i不在有效范围");
        }
        LinkNode<E>p = geti(i);
        return (E)p.data;
    }
    //设置序号为i的元素e
    public void SetElem(int i ,E e){
        if(i<0 || i>size()-1){
            throw new IllegalArgumentException("设置：位置i不在有效范围");
        }
        LinkNode<E>p = geti(i);
        p.data = e;
    }
    //查找第一位为e的元素
    public int GetNo(E e){
        int j = 0;
        LinkNode<E>p = head.next;
        while(p!=null && !p.data.equals(e)){
            j++;
            p=p.next;
        }
        if(p==null){
            return -1;
        }else{
            return j;
        }
    }
//    元素交换
    public void swap(int i,int j ){
        LinkNode<E>p = geti(i);
        LinkNode<E>q=  geti(j);
        E tmp  = p.data;
        p.data = q.data;
        q.data = tmp;
    }

}

